<?php  if ( ! defined('BASEPATH'))exit('No direct script access allowed');

/**
 * Classe principal. Ela que gerencia o layout da aplicação.
 * É o 1° controllers carregado...
 *
 * @package  controllers
 * @author   Douglas Rafael   
 */
class Main extends CI_Controller {
    // Constantes com as variáveis para guardar na sessão
    const TOTAL_ITENS = 'total_itens';
    const TOTAL_LOAN = 'total_loan';
    const TOTAL_LOAN_ATIVO = 'total_loan_ativo';
    const MODULO_EMAIL = 'modulo_multa';
    const AUTO_MULTA = 'auto_multa';
    
    const TAG_VAZIO = 0;
    
    // Variaves que podem ser usadas em qualquer controller da aplicação
    public $title = "SISBION - Sistema Bibliotecário Online";
    public $order_by;
    public $direction;
    public $order_by_name;
    public $direction_name;
    public $todos_meses = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12');
    public $todos_meses_extenso = array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');

    
    function __construct() {
        parent::__construct();
        date_default_timezone_set($this->config->item('default_timezone'));

        //Seta propriedades do template
        $this->template->load_css($this->config->item('css'));
        $this->template->load_js($this->config->item('js'));
        $this->template->set('usuario','<a title="Editar registro" href="' . site_url('usuario/?editar=') . $this->get_user_logged() . '">' .  $this->session->userdata('usu_shortname') . '</a>');
        $this->template->set('ultimo_login', $this->session->userdata('usu_ultimo_login') ? format_date($this->session->userdata('usu_ultimo_login')) : '');
        $this->template->set('total_login', string_fill($this->session->userdata('usu_total_login'), 4, 0));
        $this->template->set('total_itens', string_fill($this->session->userdata('total_itens'), 4, 0));
        $this->template->set('total_emprestimo', $this->session->userdata('total_loan'));
        $this->template->set('total_emprestimo_ativo', $this->session->userdata('total_loan_ativo'));
        $this->template->set('url_base', base_url());
        $this->template->set('logomarca', $this->get_logomarca());
        $this->template->set('title', $this->title);
        $this->template->set('page_title', 'Página inicial');
        $this->template->unset_var('page_infor');
        $this->template->set('footer', $this->config->item('footer'));
    }

    function index() {
        //verificar se usuario foi autenticado
        $this->verificaLogado();
        
        $this->listar();
    }
    
    /**
     * Lista dados na view
     */
    function listar() {
        try {
            //Carregando js necessários
            $arr_js = $this->config->item('js');
            array_push($arr_js, '../plugins/highcharts/highcharts');
            array_push($arr_js, '../plugins/highcharts/exporting');
            $this->template->load_js($arr_js);

            // Carregando class nescessárias
            $this->load->library('highcharts');
            $this->load->helper('text');
            $this->load->model('DAOEmprestimo');

            $data = $this->history_itens_loan();
            $data['emprestimos'] = $this->DAOEmprestimo->select_all_loans_loser(FALSE);
            $data['emprestimos_current_date'] = $this->DAOEmprestimo->select_all_loans_loser(TRUE);
            $data['total_rows'] = $this->treat_number_rows(count($data['emprestimos']));
            $data['check_message'] = $this->check_news_message();

            $this->template->load($this->config->item('template'), 'main', $data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
        }
    }
    
    /**
     * Retorna uma mensagem aleatória
     */
    function get_message() {
        $messages = $this->config->item('news_message');
        $rand_keys = array_rand($messages);
        
        echo $messages[$rand_keys];
    }
    
    /**
     * Verifica se existe mensagens
     */
    function check_news_message() {
        if($this->config->item('news_message') && count($this->config->item('news_message')) > 0){
            return TRUE;
        }else {
            return FALSE;
        }
    }

    /**
     * Histórico de itens emprestados realizados durante ano, mes
     * 
     */
    private function history_itens_loan() {
        try {
            $this->load->model('DAORelatorio');

            /** Anos desde a implatação do sistema **/
            $data_years = $this->DAORelatorio->year_all();
            array_shift($data_years);
            $year = implode(', ', $data_years);
            $month = implode(', ', $this->todos_meses);
            
            $data_book = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_BOOK);
            $data_magazine = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_MAGAZINE);
            $data_midia = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_MIDIA);

            // Convert your data arrays by doing:
            $categories = $this->todos_meses_extenso;

            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', 'column'));

            $oHighcharts->title = new HighchartsTitle("Histórico de itens (livro, magazine, mídia) emprestados no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle('de Janeiro à Dezembro');

            /** config DATALabel * */
            $oHighcharts->plotOptions->column->dataLabels->enabled = FALSE;
            
            /** Desabilitando Exporting */
            $oHighcharts->exporting =  new HighchartsExporting(FALSE);
            
            // Description of xAxis
            $oHighcharts->xAxis->categories = $categories;

            // These are your data
            $oHighcharts->series->addSerie(new HighchartsSerie('Livro', $this->mount_data($data_book)));
            $oHighcharts->series->addSerie(new HighchartsSerie('Magazine', $this->mount_data($data_magazine)));
            $oHighcharts->series->addSerie(new HighchartsSerie('Mídia', $this->mount_data($data_midia)));

            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            $data['infor_chart'] = $this->mount_footer_itens($year, $month);

            return $data;
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
        }
    }
    
    
    /**
     * Retorna array de 1 a 12 referente ao meses do ano com os valores preenchidos de acordo com a data passado como parametro.
     * - Cada valor é colocado no seu respectivo mês, caso não tenha valor o valor padrão é 0
     * 
     * @param type $data array de objeto
     * @return type
     */
    private function mount_data($data) {
        // Array contendo os meses do ano
        $data_meses = array(self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO,
            self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO);

        foreach ($data as $value) {
            switch (($value->mes - 1)) {
                case 0 : $data_meses[0]   = (float)$value->total;
                    continue;
                case 1 : $data_meses[1]   = (float)$value->total;
                    continue;
                case 2 : $data_meses[2]   = (float)$value->total;
                    continue;
                case 3 : $data_meses[3]   = (float)$value->total;
                    continue;
                case 4 : $data_meses[4]   = (float)$value->total;
                    continue;
                case 5 : $data_meses[5]   = (float)$value->total;
                    continue;
                case 6 : $data_meses[6]   = (float)$value->total;
                    continue;
                case 7 : $data_meses[7]   = (float)$value->total;
                    continue;
                case 8 : $data_meses[8]   = (int) $value->total;
                    continue;
                case 9 : $data_meses[9]   = (float)$value->total;
                    continue;
                case 10 : $data_meses[10] = (float)$value->total;
                    continue;
                case 11 : $data_meses[11] = (float)$value->total;
                    continue;
            }
        }

        return $data_meses;
    }
    
    
    /**
     * Retorna rodape par arelatorio
     * 
     * @param type $year
     * @param type $month
     * @return type
     */
    private function mount_footer_itens($year, $month) {
        /** Totais * */
        $total_loan = string_fill($this->DAORelatorio->amount_loan($year, $month), 4, 0);
        $total_itens_loan = string_fill($this->DAORelatorio->amount_itens_loan($year, $month), 4, 0);
        $total_book = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_BOOK), 4, 0);
        $total_magazine = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_MAGAZINE), 4, 0);
        $total_midia = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_MIDIA), 4, 0);
        
        $total_loan_active = string_fill($this->DAOEmprestimo->amount_all_loan(TRUE), 4, 0);

        return "<h3>Totais de empréstimos</h3>
                <p><b># EMPRÉSTIMOS ATIVOS: </b><span> $total_loan_active </span> | <a class='link_loan' href='" . site_url('emprestimo/listar/status/2/50') . "'> Visualizar empréstimos ativos >></a></p>
                <p><b>&#10004; Empréstimos realizados: </b><span> $total_loan </span></p>
                <p><b>&#10004; Itens emprestados: </b><span> $total_itens_loan</span></p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;<b>&#8618; Livro: </b><span> $total_book</span> | <b>Magazine: </b><span> $total_magazine</span> | <b>Mídia: </b> <span> $total_midia</span></p><br />";
    }
    
    /**
     * Verifica se um usuário se encontra logado no sistema.
     * 1. Se <b>NÃO</b> direciona para a tela de login.
     * 2. Se <b>SIM</b> o Layout com a view pincipal do sistema é carregada.
     */
    public function verificaLogado() {
        $this->controleacesso->checkLogged() != TRUE ? redirect("login") : '';
    }
    
    
    /**
     * Verifica a permissão do usuário de executar uma ação.
     * Em caso de falta de permissão direciona para uma tela padrão.
     * 
     * @param int $idAcao  Número/Id da Ação 
     */
    public function verificaPermissao($idAcao) {
        if(!$this->controleacesso->checaPermicao($idAcao)){
            $this->no_permission();
        }
    }
    
    /**
     * Verifica se o usuário logado possui AÇÃO de SUPER ADMINISTRADOR
     * 
     */
    public function verificaAcaoSuper() {
        return $this->session->userdata('super_admin');
    }
//    
//    /**
//     * Checa se tem permissão para executar ação de acordo com id
//     * 
//     * @param int $idAcao  Número/Id da Ação 
//     */
//    public function checaPermissao($idAcao) {
//        $this->controleacesso->checaPermicao($idAcao);
//    }

    /**
     * Exibe página com mensagem de não permissão
     */
    public function no_permission(){
        $this->template->set('title', 'Permissão negada | ' . $this->title);
        $this->template->set('page_title', 'Permissão negada!');
        $this->template->unset_var('page_infor');
        $this->template->load(NULL, 'utils/no_permission', NULL, FALSE, TRUE);
    }
    
    /**
     * Verifica na sessão se existe um termo de busca
     * Caso exista o mesmo é retornado
     * Se não existir é gravdo o termo
     * 
     * @param  string $searchterm   Termo/string a ser buscado
     * @return string 
     */
    public function searchtermHandler($searchterm) {
        if ($searchterm) {
            $this->session->set_userdata('searchterm', $searchterm);
            return $searchterm;
        } elseif ($this->session->userdata('searchterm')) {
            $searchterm = $this->session->userdata('searchterm');
            return $searchterm;
        } else {
            $searchterm = "";
            return $searchterm;
        }
    }
    
    /**
     * Retorno o usuário logado que estar na sessão
     * 
     * @return int  Id do usuário
     */
    public function get_user_logged() {
        $controleAcesso = new ControleAcesso();
        return $controleAcesso->get_user_logged();
    }
    
    
    /**
     * Grava na sessão dados importantes
     */
    public function check_config() {
        $this->load->model('DAOEmprestimo');
        $total_loan = string_fill($this->DAOEmprestimo->amount_all_loan_user($this->get_user_logged(), TRUE), 4, 0);
        $total_loan_ativo = string_fill($this->DAOEmprestimo->amount_all_loan_user($this->get_user_logged(), TRUE, TRUE), 4, 0);
        
        $this->load->model('DAOUsuario');
        $total_itens = $this->DAOUsuario->amount_itens_users($this->get_user_logged());
        
        $this->load->model('DAOConfig');
        $config = $this->DAOConfig->get_config();

        $newdata = array(
            self::TOTAL_LOAN => $total_loan,
            self::TOTAL_LOAN_ATIVO => $total_loan_ativo,
            self::TOTAL_ITENS => $total_itens,
            self::AUTO_MULTA => $config->auto_multa,
            self::MODULO_EMAIL => $config->modulo_email_status
        );

        $this->session->set_userdata($newdata);
    }
    
    /**
     * Retorna o caminho da logomarca
     * 
     * @return string
     */
    public function get_logomarca(){
        return site_url($this->config->item('path_img_logo')) . '/' . $this->config->item('img_logomarca');
    }
    
    /**
     * Trata os parametros para o orderby
     */
    public function treat_orderby() {
        //Trata o Order By
        if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'nome') {
            $this->order_by_name = 'nome'; // valor a exibir na url
            $this->order_by = 'nome'; // valor a enviar para o DAO
        } else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'seq') {
            $this->order_by_name = 'seq'; // valor a exibir na url
            $this->order_by = 'sequencia'; // valor a enviar para o DAO
        }
        // CONDIÇÕES da view empréstimo
        else if (($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'data_saida') || 
                 ($this->uri->segment(3) == NULL && $this->uri->segment(1) == 'emprestimo') && ($this->router->method == 'buscar')) {
            $this->order_by_name = 'data_saida'; // valor a exibir na url
            $this->order_by = 'data_saida'; // valor a enviar para o DAO
        } else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'data_retorno') {
            $this->order_by_name = 'data_retorno'; // valor a exibir na url
            $this->order_by = 'data_retorno'; // valor a enviar para o DAO
        } else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'user') {
            $this->order_by_name = 'user'; // valor a exibir na url
            $this->order_by = 'usuario'; // valor a enviar para o DAO
        } else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'status') {
            $this->order_by_name = 'status'; // valor a exibir na url
            $this->order_by = 'status'; // valor a enviar para o DAO
        }// FIM CONDIÇÕES da view empréstimo

        // CONDIÇÕES da view usuario
        else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'email') {
            $this->order_by_name = 'email'; // valor a exibir na url
            $this->order_by = 'email'; // valor a enviar para o DAO
        }else if($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'cadastro') {
            $this->order_by_name = 'cadastro'; // valor a exibir na url
            $this->order_by = 'data_cadastro'; // valor a enviar para o DAO
        }else if($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'login') {
            $this->order_by_name = 'login'; // valor a exibir na url
            $this->order_by = 'ultimo_login'; // valor a enviar para o DAO
        }// FIM CONDIÇÕES da view usuário
        
        // CONDIÇÕES da view multa
        else if ($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'valor') {
            $this->order_by_name = 'valor'; // valor a exibir na url
            $this->order_by = 'valor'; // valor a enviar para o DAO
        }else if($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'data_cobranca') {
            $this->order_by_name = 'data_cobranca'; // valor a exibir na url
            $this->order_by = 'data_cobranca'; // valor a enviar para o DAO
        }else if($this->uri->segment(3) != NULL && $this->uri->segment(3) == 'data_pagamento') {
            $this->order_by_name = 'data_pagamento'; // valor a exibir na url
            $this->order_by = 'data_pagamento'; // valor a enviar para o DAO
        }// FIM CONDIÇÕES da view multa
        else {
            $this->order_by_name = 'cod'; // valor a exibir na url
            $this->order_by = 'id'; // valor a enviar para o DAO
        }

        //Trata a direção do Order By
        if ($this->uri->segment(4) != NULL && $this->uri->segment(4) == '1') {
            $this->direction_name = '1'; // valor a exibir na url
            $this->direction = 'ASC'; // valor a enviar para o DAO
        } else {
            $this->direction_name = '2'; // valor a exibir na url
            $this->direction = 'DESC'; // valor a enviar para o DAO
        }
    }
    
    /** 
     * Trata o total de registros, utilizados nas tabelas
     * 
     * @param  int $value   Valor 
     * @return string       Valor  formatado
     */
    public function treat_number_rows($value = 0) {
        if($value > 1) {
            $value .= ' registros';
        }else {
            $value .= ' registro';
        }
        return string_fill($value, '0', 4);
    }
    
}

// END Main class

/* End of file main.php */
/* Location: ./controllers/main.php */